<?php

namespace app\models\sdiot;

use yii\base\Exception;

/**
 * 省公司相关
 * Trait ApiCmiotTrait
 * @package app\models\sdiot
 */
trait ApiCmiotTrait
{
    /**
     * 省公司短信状态重置
     * @param integer $numType 所查询的号码类型 1 msisdn 2 iccid 3 imsi
     * @param string $qryNum 所查询的号码
     * @param string $provinceid 省份编码，山东省为 531
     * @return boolean
     * @throws Exception
     */
    public function cmiotResetSMSStatus($numType, $qryNum, $provinceid)
    {
        $data = [
            'numType' => $numType,
            'qryNum' => $qryNum,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/resetSMSStatus', $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return true;
    }

    /**
     * 省公司用户当月短信查询
     * @param integer $numType 所查询的号码类型 1 msisdn 2 iccid 3 imsi
     * @param string $qryNum 所查询的号码
     * @param string $provinceid 省份编码，山东省为 531
     * @return integer
     * @throws Exception
     */
    public function cmiotQrySMSUsedInfo($numType, $qryNum, $provinceid = '531')
    {
        $data = [
            'numType' => $numType,
            'qryNum' => $qryNum,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qrySMSUsedInfo', $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0]['sms'];
    }

    /**
     * 实时流量使用查询（调用BOSS或者中移物联网接口）
     * @param integer $numType 所查询的号码类型 1 msisdn 2 iccid 3 imsi
     * @param string $queryNum 所查询的号码
     * @param string $provinceid 省份编码，山东省为 531
     * @throws Exception
     * @return array
     * 物联网卡号查询返回
     * {
     *     prodid, // 套餐ID
     *     prodname, // 套餐名称
     *     total, // 套餐总量（单位：MB）
     *     used, // 实时使用量（单位：KB）
     *     left // 套餐剩余量（单位：KB）
     * },
     * 手机号码查询返回
     * [
     *     {
     *         PRVTYPE, // 套餐类型 0 非套餐 1 套餐类
     *         PRVNAME, // 套餐名称
     *         BUSITYPE, // 套餐业务类型 1 SMS 2 GPRS省内 3 GPRS省际 4 GPRS省内和省际
     *         SUMNUM, // 包月量
     *         USEDNUM, // 已使用量 套餐内显示套餐内使用量 非套餐内显示实际使用量
     *         UNIT, // 单位
     *         SERVTYPE, // 业务类型
     *         LEFTSUM, // 剩余量
     *         FEENAME, // 费用名称
     *         USERTYPE, // 用户类型 0 所有 1 无套餐用户 2 普通PRS用户 3 随E行数据卡用户 4 G3上网本用户 5 不限量GPRS套餐用户 6 无级变速套餐用户
     *         STARTDATE, // 套餐开始时间 格式 YYYYMMDD
     *         ENDDATE, // 套餐结束时间 格式 YYYYMMDD
     *         RATEID, // 资费政策id
     *         PRVID, // 套餐id
     *     }
     * ]
     */
    public function cmiotQryGPRSRealTimeInfo($numType, $queryNum, $provinceid = '531')
    {
        $data = [
            'numType' => $numType,
            'queryNum' => $queryNum,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qryGPRSRealTimeInfo', $data);
        if ($numType == 1) { // 物联网卡号查询，调用中移物联网接口
            if ($json['status'] != 0) {
                throw new Exception($json['message']);
            }
            $list = [];
            foreach ($json['result'][0]['gprs'] as $item) {
                if (preg_match('/流量共享/', $item['prodname'])) {
                    continue;
                }
                $list[] = $item;
            }
            return $list;
        } else { // 手机号查询，调用boss接口
            if ($json['res_code'] != 0) {
                throw new Exception($json['res_desc']);
            }
            return $json['result'][0]['BUSIINFOS'];
        }
    }

    /**
     * 省公司客户流量池信息查询
     * @param string $queryDate 查询月份，时间精确到月,不输入则默认上月 YYYYMM
     * @param string $provinceid 省份编码
     * @param string $custid 省份下的企业客户编号
     * @return array
     * [
     *     {
     *         empcount, // GPRS流量池用户数
     *         gprstotal, // GPRS流量池总量（MB）
     *         subid // 用户组ID
     *     }
     * ]
     * @throws Exception
     */
    public function cmiotQryGPRSPoolInfo($queryDate, $provinceid, $custid)
    {
        $data = [
            'queryDate' => $queryDate,
            'provinceid' => $provinceid,
            'custid' => $custid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qryGPRSPoolInfo', $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result']['gprs'];
    }

    /**
     * 省公司IP地址查询GPRS信息
     * @param string $ip IP地址
     * @param string $provinceid 省份编码，山东省为 531
     * @throws Exception
     * @return array
     * {
     *     apn, // 用户接入的APN
     *     gprsStatus, // 00 离线 01 在线
     *     ip, // 用户IP地址
     *     rat // 1 3G 2 2G 6 4G及其它
     * }
     */
    public function cmiotQryGprsInfoByIp($ip, $provinceid)
    {
        $data = [
            'ip' => $ip,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qryGprsInfoByIp', $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0];
    }

    /**
     * 省用户当月GPRS查询
     * 省公司可查询所属物联卡当月截止到前一天24点为止的GPRS使用量（单位：KB）。
     * @param integer $numType 所查询的号码类型 1 msisdn 2 iccid 3 imsi
     * @param string $queryNum 所查询的号码
     * @param string $provinceid 省份编码，山东省为 531
     * @return array
     * {
     *     total_gprs // 用户当月使用的总的GPRS流量（单位：KB）
     * }
     * @throws Exception
     */
    public function cmiotQryCurMonthGprsUsedInfo($numType, $queryNum, $provinceid = '531')
    {
        $data = [
            'numType' => $numType,
            'queryNum' => $queryNum,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qryCurMonthGprsUsedInfo', $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0];
    }

    /**
     * 集团GPRS在线数实时查询
     * 省公司调用该API，可实时查询省公司所属物联卡GPRS在线数。
     * @param string $ecid 企业编号
     * @param string $ecname 企业客户名
     * @param string $provinceid 省份编码，山东省为 531
     * @throws Exception
     * @return array
     * {
     *     gprstotalnum, // 省公司所属物联卡gprs在线总数
     *     province // 省公司名称
     * }
     */
    public function cmiotQryGprsOnlineCount($ecid, $ecname, $provinceid)
    {
        $data = [
            'ecid' => $ecid,
            'ecname' => $ecname,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qryGprsOnlineCount', $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0];
    }

    /**
     * 省公司开关机状态实时查询
     * 省公司调用该能力，可查询本省下属卡号某一指定卡号的实时开关机状态。
     * @param string $msisdn 所查询的专网号码
     * @param string $provinceid 省份编码，山东省为 531
     * @throws Exception
     * @return integer 开关机状态 0 关机 1 开机
     */
    public function cmiotQryOnAndOffRealSingle($msisdn, $provinceid = '531')
    {
        $data = [
            'msisdn' => $msisdn,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qryOnAndOffRealSingle', $data);
        if ($json['status'] != 0) {
            //throw new Exception($json['message']); 
			return 0; //忽略接口错误，设置默认为 0 关机
        } else {
        return $json['result'][0]['status'];
		}
    }

    /**
     * 省公司用户卡状态实时查询R
     * 省公司调用该能力，可查询本省下属卡号当前实时状态信息，根据MSISDN号即可查询用户实时状态。
     * @param string $msisdn 所查询的专网号码
     * @param string $provinceid 省份编码，山东省为 531
     * @throws Exception
     * @return string 00 正常 02 停机 04 销号 07 待激 98 其他
     */
    public function cmiotQryCardStatusResult($msisdn, $provinceid = '531')
    {
        $data = [
            'msisdn' => $msisdn,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qryCardStatusResult', $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0]['status'];
    }

    /**
     * 省公司用户状态信息实时查询R
     * 省公司调用该能力，可查询本省下属卡号当前实时状态信息，根据MSISDN号即可查询用户实时状态。
     * @param string $msisdn 所查询的专网号码
     * @param string $provinceid 省份编码，山东省为 531
     * @throws Exception
     * @return string 00 正常 01 单向停机 02 停机 03 预销号 04 销号 05 过户 06 休眠 07 待激 99 号码不存在
     */
    public function cmiotQryUserStatusRealSingle($msisdn, $provinceid = '531')
    {
        $data = [
            'msisdn' => $msisdn,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qryUserStatusRealSingle', $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0]['STATUS'];
    }

    /**
     * 省公司在线信息实时查询
     * 省公司可调用该能力，以获取本省下属某一指定卡号的GPRS在线状态。
     * @param string $msisdn 所查询的专网号码
     * @param string $provinceid 省份编码，山东省为 531
     * @throws Exception
     * @return array
     * {
     *     APN, // 用户接入的APN
     *     IP, // 用户IP地址
     *     GPRSSTATUS, // GPRS在线状态 00 离线 01 在线
     *     RAT, //  1 3G 2 2G 6 4G及其他
     *     timestamp // 状态变更时的时间（毫秒时间戳）
     * }
     */
    public function cmiotQryGPRSInfo($msisdn, $provinceid = '531')
    {
        $data = [
            'msisdn' => $msisdn,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2('/sdiot/cmiotopen/qryGPRSInfo', $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0];
    }

    /**
     * 物联卡服务状态批量查询
     * 省公司调用该接口可批量查询所属物联卡的服务状态信息，一次最多查询300张卡。
     * @param string $numType 所查询的号码类型 1 msisdn 物联卡号 2 iccid 集成电路卡识别码 3 imsi 国际移动用户识别码
     * @param string $queryNum 所查询的号码
     * @param string $provinceid 省份编码 山东省为 531
     * @throws Exception
     * @return array
     * [
     *     {
     *         ISSIGNGPRS, // GPRS服务（大于0 开通 0 关闭）
     *         IMSI, // 专网用户的IMS
     *         ISSIGNSMS, // SMS服务（大于0 开通 0 关闭）
     *         MSISDN // 专网号码
     *     },
     *     {
     *         message, // 错误消息
     *         status, // 错误码
     *         MSISDN
     *     },
     *     ...
     * ]
     */
    public function cmiotBatchQryCardServiceStatus($numType, $queryNum, $provinceid)
    {
        $uri = '/sdiot/cmiotopen/batchQryCardServiceStatus';
        $data = [
            'numType' => $numType,
            'queryNum' => $queryNum,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2($uri, $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0];
    }

    /**
     * 在线状态批量查询
     * 省公司调用该接口可批量查询所属物联卡的在线状态信息，一次最多300个。
     * @param string $numType 所查询的号码类型 1 msisdn 物联卡号 2 iccid 集成电路卡识别码 3 imsi 国际移动用户识别码
     * @param string $queryNum 所查询的号码
     * @param string $provinceid 省份编码 山东省为 531
     * @throws Exception
     * @return array
     * [
     *     {
     *         status, // 0 正常
     *         message, // 查询结果描述
     *         msisdn, // 专网号码
     *         iccid, // 专用用户的ICCI
     *         imsi, // 专网用户的IMS
     *         apnstatus: [ // 卡号对应的各APN在线信息
     *             {
     *                 apn, // 用户接入的APN
     *                 gprsStatus, // 00 离线 01 在线
     *                 ip, // 用户IP地址
     *                 rat, // 1 3G 2 2G 6 4G及其他
     *                 statustimestamp // 状态变化时间（毫秒时间戳）
     *             }
     *         ]
     *     },
     *     ...
     * ]
     */
    public function cmiotBatchQryGprsStatus($numType, $queryNum, $provinceid)
    {
        $uri = '/sdiot/cmiotopen/batchQryGprsStatus';
        $data = [
            'numType' => $numType,
            'queryNum' => $queryNum,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2($uri, $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0];
    }

    /**
     * 省公司号码信息查询
     * 省公司调用该能力，可根据ICCID、IMSI、MSISDN任意1个查询剩余2个的能力。
     * @param string $numType 所查询的号码类型 1 msisdn 物联卡号 2 iccid 集成电路卡识别码 3 imsi 国际移动用户识别码
     * @param string $queryNum 所查询的号码
     * @param string $provinceid 省份编码 山东省为 531
     * @throws Exception
     * @return array
     * {
     *     IMSI, // 专网用户的IMSI
     *     MSISDN, // 专网号码
     *     ICCID // 专网用户的ICCID
     * }
     */
    public function cmiotQryNumberInfo($numType, $queryNum, $provinceid = '531')
    {
        $uri = '/sdiot/cmiotopen/qryNumberInfo';
        $data = [
            'numType' => $numType,
            'queryNum' => $queryNum,
            'provinceid' => $provinceid,
        ];
        $json = $this->post2($uri, $data);
        if ($json['status'] != 0) {
            throw new Exception($json['message']);
        }
        return $json['result'][0];
    }
}
